]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
status/network: Special-case wireless hotspots
authorFlorian Müllner <fmuellner@gnome.org>
Fri, 5 Aug 2022 11:40:45 +0000 (13:40 +0200)
committerMarge Bot <marge-bot@gnome.org>
Wed, 10 Aug 2022 16:37:15 +0000 (16:37 +0000)
If any device is in hotspot mode, use the corresponding item as
primary. Disable the (future QuickMenuToggle) menu in that case,
and turn off the hotspot when activated rather than toggling the
global wireless switch.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2408>

js/ui/status/network.js

index abd3c3f518afbc5b41fb02e118433976ed977f09..9e2ef3a8b83feaff8b0ee588642bba00f63c3070 100644 (file)
@@ -1124,6 +1124,14 @@ const NMWirelessDeviceItem = GObject.registerClass({
         return ip4config.get_method() === NM.SETTING_IP4_CONFIG_METHOD_SHARED;
     }
 
+    activate() {
+        if (!this.is_hotspot)
+            return;
+
+        const {activeConnection} = this._device;
+        this._client.deactivate_connection_async(activeConnection, null, null);
+    }
+
     _activeApChanged() {
         this._activeAccessPoint?.disconnectObject(this);
         this._activeAccessPoint = this._device.active_access_point;
@@ -1690,11 +1698,20 @@ class NMDeviceSection extends NMSection {
     }
 });
 
-const NMWirelessSection = GObject.registerClass(
-class NMWirelessSection extends NMDeviceSection {
+const NMWirelessSection = GObject.registerClass({
+    Properties: {
+        'menu-enabled': GObject.ParamSpec.boolean('menu-enabled', '', '',
+            GObject.ParamFlags.READWRITE,
+            false),
+    },
+}, class NMWirelessSection extends NMDeviceSection {
     constructor() {
         super(NM.DeviceType.WIFI);
 
+        this._itemBinding.bind('is-hotspot',
+            this, 'menu-enabled',
+            GObject.BindingFlags.INVERT_BOOLEAN);
+
         this.menu.addSettingsAction(_('All Networks'),
             'gnome-wifi-panel.desktop');
     }
@@ -1711,7 +1728,11 @@ class NMWirelessSection extends NMDeviceSection {
     }
 
     activate() {
-        this._client.wireless_enabled = !this._client.wireless_enabled;
+        const primaryItem = this._itemBinding.source;
+        if (primaryItem?.is_hotspot)
+            primaryItem.activate();
+        else
+            this._client.wireless_enabled = !this._client.wireless_enabled;
     }
 
     _createDeviceMenuItem(device) {
@@ -1722,6 +1743,14 @@ class NMWirelessSection extends NMDeviceSection {
         // handled via a property binding
     }
 
+    _getPrimaryItem() {
+        const hotspot = [...this._items.values()].find(i => i.is_hotspot);
+        if (hotspot)
+            return hotspot;
+
+        return super._getPrimaryItem();
+    }
+
     _shouldShowDevice(device) {
         // don't disappear if wireless-enabled is false
         if (device.state === NM.DeviceState.UNAVAILABLE)